// src/middleware/logger.middleware.js
import winston from 'winston';
import WinstonDailyRotateFile from 'winston-daily-rotate-file';
import fs from 'fs';
import path from 'path';

// 创建日志文件夹，如果没有的话
const logsDirectory = 'logs';

if (!fs.existsSync(logsDirectory)) {
    fs.mkdirSync(logsDirectory);
}

// 配置 winston 轮换文件
const transport = new WinstonDailyRotateFile({
    filename: path.join(logsDirectory, 'application-%DATE%.log'),  // 日志文件名，%DATE%会被替换成日期
    datePattern: 'YYYY-MM-DD',  // 日志文件的日期格式
    maxSize: '20m',  // 每个日志文件的最大尺寸
    maxFiles: '7d',  // 保留最近7天的日志，过期的日志将自动删除
    zippedArchive: true,  // 压缩过期的日志文件
});

export const logger = winston.createLogger({
    level: 'info',
    format: winston.format.combine(
        winston.format.colorize(),  // 为控制台输出添加颜色
        winston.format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),  // 添加时间戳
        winston.format.printf(
            ({ timestamp, level, message }) => {
                return `${timestamp} [${level}]: ${message}`;
            }
        )
    ),
    transports: [
        // 控制台输出
        new winston.transports.Console({
            format: winston.format.combine(
                winston.format.colorize(), // 控制台颜色化
                winston.format.simple() // 简单输出
            ),
        }),
        transport,  // 日志轮换文件输出
    ],
});

// 创建一个中间件来记录请求日志
const requestLogger = (req, res, next) => {
    const start = Date.now();

    // 捕获请求响应事件
    res.on('finish', () => {
        const duration = Date.now() - start;
        logger.info(
            `Request: ${req.method} ${req.originalUrl}`,
            {
                ip: req.ip,
                userAgent: req.get('User-Agent'),
                statusCode: res.statusCode,
                duration: `${duration}ms`,
                body: req.body,
                query: req.query,
                responseBody: req.responseBody,  // 记录响应体
            }
        );
    });

    // 错误捕获
    res.on('error', (err) => {
        logger.error(`Request error: ${err.stack}`);
    });

    next();
};

export default requestLogger;